<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="WBNSz" id="WBNSz"><span data-lake-id="uc3f677fe" id="uc3f677fe">典型回答</span></h1>
  <p data-lake-id="u497725b1" id="u497725b1"><br></p>
  <p data-lake-id="u4e44c0e1" id="u4e44c0e1"><span data-lake-id="u926a3442" id="u926a3442">我们都知道，MySQL的数据是存储在磁盘上面的（Memory引擎除外），但是如果每次数据的查询和修改都直接和磁盘交互的话，性能是很差的。</span></p>
  <p data-lake-id="u53db82f0" id="u53db82f0"><span data-lake-id="uc8ec0dde" id="uc8ec0dde">​</span><br></p>
  <p data-lake-id="u2fb27794" id="u2fb27794"><span data-lake-id="u8d25644a" id="u8d25644a">于是，为了提升读写性能，Innodb引擎就引入了一个中间层，就是buffer pool。</span></p>
  <p data-lake-id="u94acdec9" id="u94acdec9"><span data-lake-id="u83af62f8" id="u83af62f8">​</span><br></p>
  <p data-lake-id="uc32c1f29" id="uc32c1f29"><span data-lake-id="u05ab0a22" id="u05ab0a22">buffer是在内存上的一块连续空间，他主要的用途就是用来缓存数据页的，每个数据页的大小是16KB。</span></p>
  <p data-lake-id="ua1b5dde5" id="ua1b5dde5"><span data-lake-id="ueee520fd" id="ueee520fd">​</span><br></p>
  <blockquote data-lake-id="ub911f31a" id="ub911f31a">
   <p data-lake-id="u6b689525" id="u6b689525"><span data-lake-id="u34da93d4" id="u34da93d4">页是Innodb做数据存储的单元，无论是在磁盘，还是buffe pool中，都是按照页读取的，这也是一种'预读'的思想。</span></p>
  </blockquote>
  <p data-lake-id="ubc59e219" id="ubc59e219"><span data-lake-id="uaa892bbb" id="uaa892bbb">​</span><br></p>
  <p data-lake-id="u0a1361ea" id="u0a1361ea"><br></p>
  <p data-lake-id="udb2bdcab" id="udb2bdcab" style="text-align: center"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690545511097-84b0dae4-d97b-4db0-8820-6f14ae00abf7.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_21%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ufa910774" id="ufa910774"><br></p>
  <p data-lake-id="u4b56dc50" id="u4b56dc50"><span data-lake-id="u40151ee1" id="u40151ee1">有了buffer pool之后，当我们想要做数据查询的时候，InnoDB会首先检查Buffer Pool中是否存在该数据。如果存在，数据就可以直接从内存中获取，避免了频繁的磁盘读取，从而提高查询性能。如果不存在再去磁盘中进行读取，磁盘中如果找到了的数据，则会把该数据所在的页直接复制一份到buffer pool中，并返回给客户端，后续的话再次读取就可以从buffer pool中就近读取了。</span></p>
  <p data-lake-id="u8f2efc32" id="u8f2efc32"><span data-lake-id="u100caf1a" id="u100caf1a">​</span><br></p>
  <p data-lake-id="u1ebb3214" id="u1ebb3214" style="text-align: center"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690544427750-26a015d4-7ad6-40cf-ae38-85932481f1c1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_16%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u669dac81" id="u669dac81"><span data-lake-id="u0eeea52c" id="u0eeea52c">​</span><br></p>
  <p data-lake-id="ub6f00f61" id="ub6f00f61"><span data-lake-id="u01e693de" id="u01e693de">当需要修改的时候也一样，需要现在buffer pool中做修改，然后再把他写入到磁盘中。</span></p>
  <p data-lake-id="uc69e5f7c" id="uc69e5f7c"><span data-lake-id="u529ee92d" id="u529ee92d">​</span><br></p>
  <p data-lake-id="u96356eff" id="u96356eff"><span data-lake-id="u3bf9acf8" id="u3bf9acf8">但是因为buffer pool是基于内存的，所以空间不可能无限大，他的默认大小是</span><span data-lake-id="u41cc0977" id="u41cc0977" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">128M，当然这个</span><span data-lake-id="ud38ec849" id="ud38ec849">大小也不是完全固定的，我们可以调整，可以通过修改MySQL配置文件中的innodb_buffer_pool_size参数来调整Buffer Pool的大小</span><span data-lake-id="u149782bb" id="u149782bb" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">。</span></p>
  <p data-lake-id="u73becd0f" id="u73becd0f"><span data-lake-id="uc77d80d1" id="uc77d80d1" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <pre lang="java"><code>
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';  -- 查看buffer pool

SET GLOBAL innodb_buffer_pool_size = 512M; -- 修改buffer pool
</code></pre>
  <p data-lake-id="uc7969477" id="uc7969477"><span data-lake-id="u0db1ca10" id="u0db1ca10" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <h1 data-lake-id="k3JmE" id="k3JmE"><span data-lake-id="u1d339106" id="u1d339106" style="color: rgb(51, 51, 51)">扩展知识</span></h1>
  <p data-lake-id="uaf5ed639" id="uaf5ed639"><span data-lake-id="u43cd647b" id="u43cd647b">​</span><br></p>
  <h2 data-lake-id="FSqIK" id="FSqIK"><span data-lake-id="u9c36bbf4" id="u9c36bbf4">buffer pool和query cache的区别</span></h2>
  <p data-lake-id="u37533337" id="u37533337"><span data-lake-id="u27c67ee9" id="u27c67ee9" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="u3f5ca3f9" id="u3f5ca3f9"><span data-lake-id="uc451a826" id="uc451a826" class="lake-fontsize-12">在Innodb中，除了buffer pool，还有一个缓存层是用来做数据缓存，提升查询效率的，很多人搞不清楚他和buffer pool的区别是什么。</span></p>
  <p data-lake-id="u069810ad" id="u069810ad"><span data-lake-id="u7f808d4b" id="u7f808d4b" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="u18132704" id="u18132704"><span data-lake-id="uda6d012f" id="uda6d012f">首先就是他们目的和作用不同。Buffer Pool用于缓存表和索引的数据页，从而加速读取操作；而Query Cache用于缓存查询结果，减少重复查询的执行时间。</span></p>
  <p data-lake-id="ua99b4eca" id="ua99b4eca"><span data-lake-id="udbc2c9e2" id="udbc2c9e2">​</span><br></p>
  <p data-lake-id="ue54acf11" id="ue54acf11"><span data-lake-id="u6e3355dd" id="u6e3355dd">Buffer Pool主要与存储引擎InnoDB相关，而Query Cache也支持其他的引擎，如MyISAM等。所以，Query Cache是位于Server层的优化技术，而Buffer Pool 是位于引擎层的优化技术。</span></p>
  <p data-lake-id="u1985d48f" id="u1985d48f"><br></p>
  <p data-lake-id="u9b680eef" id="u9b680eef"><span data-lake-id="u58138b70" id="u58138b70">需要注意的是，在MySQL 5.7版本中，Query Cache已经被标记为废弃，并在MySQL 8.0版本中彻底被移除了。</span></p>
  <p data-lake-id="u37f204bb" id="u37f204bb"><span data-lake-id="u60e8a834" id="u60e8a834"><br></span></p>
  <h2 data-lake-id="zolqs" id="zolqs"><span data-lake-id="u06057147" id="u06057147">读写过程</span></h2>
  <p data-lake-id="u02fb3124" id="u02fb3124"><br></p>
 </body>
</html>